package com.wjr.braveheart.http.callback;

import android.content.Context;

import com.wjr.braveheart.http.GoHttp;
import com.wjr.braveheart.http.Utils;
import com.wjr.braveheart.http.converter.Converter;
import com.wjr.braveheart.utils.LogUtils;

import java.util.Map;

/**
 * Created by WeiJinRan on 2018/1/15.
 * Email 994425089@qq.com.
 * Version 1.0
 * Describe:网络请求返回的结果不全是json数据，因此不适用泛型，
 * 否则返回对象会出问题 如：成功 data对象{"",""} 失败data:""
 * 所以可重写CallBack实现EngineCallBack，在重写的CallBack进行单独处理
 * PS: Not easy to write code, please indicate.
 */
public abstract class HttpCallback<T> implements EngineCallback {
    @Override
    public void onPreExecute(Context context, Map<String, Object> params) {
        //在这里添加公共参数，与项目业务逻辑有关
        // params.put(key,value);
        onPreExecute();
    }

    /**
     * 开始执行
     */
    public void onPreExecute() {

    }

    @Override
    public void onSuccess(String resultStr) {
        Converter.Factory converterFactory = GoHttp.getDefaultConfig().getFactory();
        if (converterFactory == null) {
            throw new RuntimeException("数据解析转换错误，请在GoHttp中配置解析工厂");
        }
        // 数据解析转换
        try {
            Class<T> type = (Class<T>) Utils.analysisClazzInfo(this);
            Converter<T, String> converter = converterFactory.responseConverter(type);
            T result = converter.convert(resultStr);
            //如果onSuccess(result)中报错，则会被try-catch所捕获，
            //其错误不局限于数据转换错误(数据转换错误Json解析错误)
            onSuccess(result);
        } catch (Exception e) {
            e.printStackTrace();
            LogUtils.e(e.getMessage());
        }
    }

    /**
     * 返回可直接操作的对象
     *
     * @param result
     */
    public abstract void onSuccess(T result);
}
